package com.vanysoft.business.base.org.service;

import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.plugins.Page;
import com.vanysoft.business.base.org.controller.demo.OrgDemo;
import com.vanysoft.business.base.org.dao.BaseOrgMapper;
import com.vanysoft.business.base.org.entity.TBaseOrg;
import com.vanysoft.business.base.user.dao.BaseUserMapper;
import com.vanysoft.business.index.dao.LoginMapper;
import com.vanysoft.business.index.entity.LoginUserinfo;
import com.vanysoft.business.sys.entity.UserInfo;
import com.vanysoft.common.utils.string.StringUtil;
import com.vanysoft.framework.constants.DbConstants;
import com.vanysoft.framework.exception.VanySoftBaseException;
import com.vanysoft.framework.messagesource.MessageCodeConstant;
import com.vanysoft.framework.utils.PinYin;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import java.util.*;

/**
 * 类名称：OrgService
 * 类描述：组织机构Service
 * 创建人：SharpClaw_x
 * 创建时间：2017年5月19日 下午3:55:12
 * 修改人：Tian_
 * 修改时间：2017年5月19日 下午3:55:12
 * 版本信息：@version 1.0
 * Copyright (c) 2017SharpClaw-版权所有
 * 修改备注：
 */
@Service
@Transactional(readOnly = true)
public class BaseOrgService {

    @Autowired
    private BaseOrgMapper tBaseOrgMapper;

    @Autowired
    private BaseUserMapper baseUserMapper;

    @Autowired
    private LoginMapper loginMapper;

    /**
     * Function Name               addOrg
     *
     * @param org
     * @return
     * @throws VanySoftBaseException
     * @description 添加组织机构
     * Modify History:              Date             Programmer       Notes
     * ---------        ---------------  ---------
     * 2017年5月19日 下午4:51:13           SharpClaw_x      Initial
     * *********************************************************************
     */
    @Transactional
    public void addOrg(OrgDemo org) throws VanySoftBaseException {

        if (StringUtils.isBlank(org.getOrgCode())) {
            throw new VanySoftBaseException(MessageCodeConstant.OrgException.CODE_EMPTY);
        }
        if (StringUtils.isBlank(org.getOrgName())) {
            throw new VanySoftBaseException(MessageCodeConstant.OrgException.NAME_EMPTY);
        }
        if (StringUtils.equals(org.getOrgCode(), org.getParentOrgCode())) {
            throw new VanySoftBaseException(MessageCodeConstant.OrgException.PARENTCODE_EQUAL_ORGCODE);
        }

        if (checkOrgName(org.getOrgName(), org.getParentOrgCode())) {
            throw new VanySoftBaseException(MessageCodeConstant.OrgException.NAME_EXIST);
        }

        //检测组织机构代码是否重复，并抛出异常
        TBaseOrg orgDB = tBaseOrgMapper.selectByPrimaryKey(org.getOrgCode());

        if (orgDB == null) {
            orgDB = new TBaseOrg();

            orgDB.setOrgCode(org.getOrgCode());
            orgDB.setOrgName(org.getOrgName());
            orgDB.setSearchKeyWord1(PinYin.getPinYinHeadChar(org.getOrgName()).toUpperCase());
            orgDB.setSearchKeyWord2(PinYin.getPingYin(org.getOrgName()).toUpperCase());

            //判断是否是根节点
            if (StringUtils.isNotEmpty(org.getParentOrgCode())) {
                orgDB.setParentOrgCode(org.getParentOrgCode());
            }

            orgDB.setOfficeTel(org.getOfficeTel());
            orgDB.setIsAvailable(DbConstants.IS_AVAILABLE);
            orgDB.setUpdateTime(new Date());

            String orderNum = queryOrgSort(org.getParentOrgCode());
            orgDB.setOrgOrderNumber(orderNum);
            tBaseOrgMapper.insert(orgDB);

        } else {
            if (orgDB.getIsAvailable().equals(DbConstants.IS_NOT_AVAILABLE)) {
                //如果部门呗逻辑删除了，则重新“添加”该部门
                orgDB.setOrgCode(org.getOrgCode());
                orgDB.setOrgName(org.getOrgName());
                orgDB.setSearchKeyWord1(PinYin.getPinYinHeadChar(org.getOrgName()).toUpperCase());
                orgDB.setSearchKeyWord2(PinYin.getPingYin(org.getOrgName()).toUpperCase());

                //判断是否是根节点
                if (StringUtils.isNotEmpty(org.getParentOrgCode())) {
                    orgDB.setParentOrgCode(org.getParentOrgCode());
                }

                orgDB.setOfficeTel(org.getOfficeTel());
                orgDB.setIsAvailable(DbConstants.IS_AVAILABLE);
                orgDB.setUpdateTime(new Date());

                String orderNum = queryOrgSort(org.getParentOrgCode());
                orgDB.setOrgOrderNumber(orderNum);
                tBaseOrgMapper.updateByPrimaryKey(orgDB);

            } else {
                throw new VanySoftBaseException(MessageCodeConstant.OrgException.EXIST_ERROR);
            }
        }


    }

    /**
     * Function Name               addOrgBatch
     *
     * @param orgs
     * @throws VanySoftBaseException
     * @description 噗两添加
     * Modify History:              Date             Programmer       Notes
     * ---------        ---------------  ---------
     * 2017年6月26日 上午10:22:23           SharpClaw_x      Initial
     * *********************************************************************
     */
    @Transactional
    public void addOrgBatch(List<OrgDemo> orgs) throws VanySoftBaseException {
        for (OrgDemo org : orgs) {
            TBaseOrg orgDB = new TBaseOrg();
            orgDB.setOrgCode(org.getOrgCode());
            orgDB.setOrgName(org.getOrgName());
            orgDB.setSearchKeyWord1(PinYin.getPinYinHeadChar(org.getOrgName()).toUpperCase());
            orgDB.setSearchKeyWord2(PinYin.getPingYin(org.getOrgName()).toUpperCase());

            //判断是否是根节点
            if (StringUtils.isNotEmpty(org.getParentOrgCode())) {
                orgDB.setParentOrgCode(org.getParentOrgCode());
            }

            orgDB.setOfficeTel(org.getOfficeTel());
            orgDB.setIsAvailable(DbConstants.IS_AVAILABLE);
            orgDB.setUpdateTime(new Date());

            String orderNum = queryOrgSort(org.getParentOrgCode());
            orgDB.setOrgOrderNumber(orderNum);
            tBaseOrgMapper.insert(orgDB);

        }
    }

    /**
     * Function Name               addOrgBatch
     *
     * @return
     * @description 批量导出Org
     * Modify History:              Date             Programmer       Notes
     * ---------        ---------------  ---------
     * 2017年6月8日 上午9:53:03           SharpClaw_x      Initial
     * *********************************************************************
     */
    public List<Map<String, Object>> queryOrgList(String orgCode, String userId) {
        String orgCodes = tBaseOrgMapper.queryOrgChildren(orgCode);
        return tBaseOrgMapper.queryOrgList(orgCodes);
    }

    /**
     * Function Name               queryOrg
     *
     * @param orgCode
     * @return
     * @description Modify History:              Date             Programmer       Notes
     * ---------        ---------------  ---------
     * 2017年6月23日 下午2:52:01           SharpClaw_x      Initial
     * *********************************************************************
     */
    public TBaseOrg queryOrg(String orgCode) {
        return tBaseOrgMapper.selectByPrimaryKey(orgCode);
    }

    /**
     * Function Name               queryOrg
     *
     * @param orgName
     * @param parentCode
     * @return
     * @description 根据名称和父节点查询
     * Modify History:              Date             Programmer       Notes
     * ---------        ---------------  ---------
     * 2017年6月23日 下午2:56:19           SharpClaw_x      Initial
     * *********************************************************************
     */
    public TBaseOrg queryOrg(String orgName, String parentCode) {
        return tBaseOrgMapper.selectByParentCodeAndName(orgName, parentCode);
    }

    /**
     * Function Name               queryOrgFromList
     *
     * @param orgName
     * @param parentCode
     * @param orgs
     * @return
     * @description 从orgList查找
     * Modify History:              Date             Programmer       Notes
     * ---------        ---------------  ---------
     * 2017年6月26日 上午10:04:25           SharpClaw_x      Initial
     * *********************************************************************
     */
    public TBaseOrg queryOrgFromList(String orgName, String parentCode, List<TBaseOrg> orgs) {
        for (TBaseOrg org : orgs) {
            if (StringUtils.equals(orgName, org.getOrgName()) && StringUtils.equals(org.getParentOrgCode(), parentCode)) {
                return org;
            }
        }

        return null;
    }

    /**
     * Function Name               queryOrgTree
     *
     * @param userId
     * @return
     * @throws VanySoftBaseException
     * @description 查询组织机构树
     * Modify History:              Date             Programmer       Notes
     * ---------        ---------------  ---------
     * 2017年5月23日 下午5:15:02           SharpClaw_x      Initial
     * *********************************************************************
     */
    @SuppressWarnings("rawtypes")
    public List<Map> queryOrgTree(String userId) throws VanySoftBaseException {
        //查询当前登录用户拥有的组织机构数据,拼接成字符串
        String myOrgCodes = queryMyAllOrg(userId);
        List<Map<String, Object>> list = tBaseOrgMapper.queryOrgTree(myOrgCodes);
        return StringUtil.listToTree(list, "id", "pid");
    }

    @SuppressWarnings("rawtypes")
    public List<Map> queryOrgTreeWithOutSelf(String userId, String orgCode) throws VanySoftBaseException {
        List<Map> tree = queryOrgTree(userId);
        StringUtil.removeSelfOrgTree(tree, orgCode);
        return tree;
    }

    /**
     * Function Name               queryMyAllOrg
     *
     * @param userId
     * @return
     * @description 查询我的权限下的部以及所有的子部门
     * Modify History:              Date             Programmer       Notes
     * ---------        ---------------  ---------
     * 2017年6月26日 下午3:02:18           SharpClaw_x      Initial
     * *********************************************************************
     */
    public String queryMyAllOrg(String userId) {
        int adminFlag = loginMapper.checkAdminByUserId(userId);
        String myOrgCodes = null;
        if (adminFlag == 0) {
            myOrgCodes = baseUserMapper.queryDataManagement(userId);
//			//查询角色已分配数据信息集合-递归
//			List<Map> allotDataList=baseRoleMapper.queryRecursionDataByCodes(myOrgCodes);
//			//去重
//			myOrgCodes=CommonUtil.removeRepeatCode(allotDataList, "orgCodeList");
        } else {
            myOrgCodes = tBaseOrgMapper.queryAdminOrgCodes();
        }
        String[] orgCodeArr = myOrgCodes.split(",");
        StringBuilder myChildrenCodes = new StringBuilder();
        for (String orgCode : orgCodeArr) {
            myChildrenCodes.append(",").append(tBaseOrgMapper.queryOrgChildren(orgCode));
        }
        myChildrenCodes = new StringBuilder(myChildrenCodes.substring(1));
        return myChildrenCodes.toString();
    }


    /**
     * Function Name               queryAllOrgList
     *
     * @return
     * @description TODO(查询所有机构用于发送消息 - 消息中心)
     * Modify History:              Date             Programmer       Notes
     * ---------        ---------------  ---------
     * 2017年8月29日 上午10:32:05          SharpClaw_x                     Initial
     * *********************************************************************
     */
    public List<Map> queryAllOrgList() {
        List<Map<String, Object>> list = tBaseOrgMapper.queryAllOrgTree();
        return StringUtil.listToTree(list, "id", "pid");
    }

    /**
     * Function Name               updateOrg
     *
     * @param org
     * @return
     * @throws VanySoftBaseException
     * @description 更新
     * Modify History:              Date             Programmer       Notes
     * ---------        ---------------  ---------
     * 2017年5月23日 下午5:15:14           SharpClaw_x      Initial
     * *********************************************************************
     */
    @Transactional
    public String updateOrg(OrgDemo org) throws VanySoftBaseException {

        if (StringUtils.isBlank(org.getOrgCode())) {
            throw new VanySoftBaseException(MessageCodeConstant.OrgException.CODE_EMPTY);
        }
        if (StringUtils.isBlank(org.getOrgName())) {
            throw new VanySoftBaseException(MessageCodeConstant.OrgException.NAME_EMPTY);
        }

        TBaseOrg orgDB = tBaseOrgMapper.selectByPrimaryKey(org.getOrgCode());

        if (orgDB == null) {
            throw new VanySoftBaseException(MessageCodeConstant.OrgException.ORG_NOT_EXIST);
        }

        orgDB.setOrgName(org.getOrgName());
        orgDB.setSearchKeyWord1(PinYin.getPinYinHeadChar(org.getOrgName()).toUpperCase());
        orgDB.setSearchKeyWord2(PinYin.getPingYin(org.getOrgName()).toUpperCase());
        if (StringUtils.isNotEmpty(org.getParentOrgCode())) {
            orgDB.setParentOrgCode(org.getParentOrgCode());
        }
        orgDB.setOfficeTel(org.getOfficeTel());
        orgDB.setUpdateTime(new Date());

        tBaseOrgMapper.updateByPrimaryKey(orgDB);

        return MessageCodeConstant.RTN_CODE_SUCCESS;
    }

    /**
     * Function Name               updateOrgRoot
     *
     * @param orgCode
     * @description 将节点修改为根节点
     * Modify History:              Date             Programmer       Notes
     * ---------        ---------------  ---------
     * 2017年7月10日 上午10:26:35           SharpClaw_x      Initial
     * *********************************************************************
     */
    @Transactional
    public void updateOrgRoot(String orgCode) {
        TBaseOrg org = tBaseOrgMapper.selectByPrimaryKey(orgCode);
        if (org == null) {
            throw new VanySoftBaseException(MessageCodeConstant.OrgException.ORG_NOT_EXIST);
        }
        org.setParentOrgCode(null);
        tBaseOrgMapper.updateByPrimaryKey(org);

    }

    /**
     * Function Name               deleteOrg
     *
     * @param orgCode
     * @return
     * @throws VanySoftBaseException
     * @description 删除组织机构
     * Modify History:              Date             Programmer       Notes
     * ---------        ---------------  ---------
     * 2017年5月23日 下午6:50:04           SharpClaw_x      Initial
     * *********************************************************************
     */
    @Transactional
    public String deleteOrg(String orgCode) throws VanySoftBaseException {
        //有子机构不能删除
        if (checkOrgChild(orgCode)) {
            throw new VanySoftBaseException(MessageCodeConstant.OrgException.CHILD_EXIST_ERROR);
        }
        //当前机构下有人员不能删除
        if (checkOrgPerson(orgCode)) {
            throw new VanySoftBaseException(MessageCodeConstant.OrgException.PERSON_EXIST_ERROR);
        }
        //执行删除，逻辑删除
        TBaseOrg orgDB = tBaseOrgMapper.selectByPrimaryKey(orgCode);

        orgDB.setIsAvailable(DbConstants.IS_NOT_AVAILABLE);
        orgDB.setUpdateTime(new Date());
        tBaseOrgMapper.updateByPrimaryKeySelective(orgDB);

        return MessageCodeConstant.RTN_CODE_SUCCESS;
    }

    /**
     * Function Name               upOrg
     *
     * @param orgCode
     * @return
     * @throws VanySoftBaseException
     * @description 上移组织机构
     * Modify History:              Date             Programmer       Notes
     * ---------        ---------------  ---------
     * 2017年5月24日 上午9:32:14           SharpClaw_x      Initial
     * *********************************************************************
     */
    @Transactional
    public String upOrg(String orgCode) throws VanySoftBaseException {
        TBaseOrg thisOrg = tBaseOrgMapper.selectByPrimaryKey(orgCode);

        String character = thisOrg.getOrgOrderNumber().substring(0, 1);
        String number = thisOrg.getOrgOrderNumber().substring(1);
        TBaseOrg upOrg = tBaseOrgMapper.queryUpOrg(character, number);

        if (upOrg != null) {
            //交换两条数据的位置：OrgOrderNumber
            String thisOrderNum = thisOrg.getOrgOrderNumber();

            thisOrg.setOrgOrderNumber(upOrg.getOrgOrderNumber());
            thisOrg.setUpdateTime(new Date());

            upOrg.setOrgOrderNumber(thisOrderNum);
            upOrg.setUpdateTime(new Date());

            tBaseOrgMapper.updateByPrimaryKeySelective(thisOrg);
            tBaseOrgMapper.updateByPrimaryKeySelective(upOrg);

        } else {
            //已经最顶
            throw new VanySoftBaseException(MessageCodeConstant.OrgException.TOP_ALREADY_ERROR);
        }

        return MessageCodeConstant.RTN_CODE_SUCCESS;
    }

    /**
     * Function Name               downOrg
     *
     * @param orgCode
     * @return
     * @throws VanySoftBaseException
     * @description 下移组织机构
     * Modify History:              Date             Programmer       Notes
     * ---------        ---------------  ---------
     * 2017年5月24日 上午9:32:02           SharpClaw_x      Initial
     * *********************************************************************
     */
    @Transactional
    public String downOrg(String orgCode) throws VanySoftBaseException {
        TBaseOrg thisOrg = tBaseOrgMapper.selectByPrimaryKey(orgCode);

        String character = thisOrg.getOrgOrderNumber().substring(0, 1);
        String number = thisOrg.getOrgOrderNumber().substring(1);
        TBaseOrg downOrg = tBaseOrgMapper.queryDownOrg(character, number);

        if (downOrg != null) {
            //交换两条数据的位置：OrgOrderNumber
            String thisOrderNum = thisOrg.getOrgOrderNumber();

            thisOrg.setOrgOrderNumber(downOrg.getOrgOrderNumber());
            thisOrg.setUpdateTime(new Date());

            downOrg.setOrgOrderNumber(thisOrderNum);
            downOrg.setUpdateTime(new Date());

            tBaseOrgMapper.updateByPrimaryKeySelective(thisOrg);
            tBaseOrgMapper.updateByPrimaryKeySelective(downOrg);

        } else {
            //已经最顶
            throw new VanySoftBaseException(MessageCodeConstant.OrgException.BUTTOM_ALREADY_ERROR);
        }
        return MessageCodeConstant.RTN_CODE_SUCCESS;
    }

    /**
     * Function Name               queryOrgChildren
     *
     * @param orgCode
     * @return
     * @description 查询机构下所有子机构
     * Modify History:              Date             Programmer       Notes
     * ---------        ---------------  ---------
     * 2017年6月7日 下午6:24:11           SharpClaw_x      Initial
     * *********************************************************************
     */
    public List<TBaseOrg> queryOrgChildren(String orgCode) {
        String orgCodes = tBaseOrgMapper.queryOrgChildren(orgCode);

        List<TBaseOrg> orgs = tBaseOrgMapper.queryOrgChildrenObj(orgCodes);

        return orgs;
    }

    /**
     * Function Name               queryOrgUsers
     *
     * @param orgCode
     * @param pageSize
     * @param pageNum
     * @param searchContent
     * @return
     * @throws VanySoftBaseException
     * @description 查询组织机构下的人
     * Modify History:              Date             Programmer       Notes
     * ---------        ---------------  ---------
     * 2017年5月24日 上午10:04:59           SharpClaw_x      Initial
     * *********************************************************************
     */
    public Map<String, Object> queryOrgUsers(String orgCode, String userId, Integer pageSize, Integer pageNum, String searchContent, String status) throws VanySoftBaseException {
        Map<String, Object> users = new HashMap<String, Object>();

        //获取当前部门下的子部门
        String orgCodes = tBaseOrgMapper.queryOrgChildren(orgCode);

        if (StringUtils.isNotEmpty(searchContent)) {
            orgCodes = queryMyAllOrg(userId);
        }

        if (StringUtils.isEmpty(searchContent.trim())) {
            searchContent = null;
        } else {
            searchContent = StringUtils.upperCase(searchContent.trim());
        }

        if (StringUtils.isEmpty(status)) {
            status = null;
        }

        //分页工具
        Page<Map<String, Object>> page = new Page<>(pageNum, pageSize);
        List<LoginUserinfo> userList = tBaseOrgMapper.queryOrgUsers(page, orgCodes, searchContent, status);

        int forBidden = tBaseOrgMapper.queryForbiddenOrgUsers(orgCodes, searchContent);
        int NotForBidden = tBaseOrgMapper.queryNotForbiddenOrgUsers(orgCodes, searchContent);

        users.put("rows", userList);
        users.put("total", page.getTotal());
        users.put("forBidden", forBidden);
        users.put("NotForBidden", NotForBidden);

        return users;
    }


    public List<Map<String, Object>> queryOnlyOrgUsers(String orgCode) {
        return tBaseOrgMapper.queryOnlyOrgUsers(orgCode);
    }

    /**
     * Function Name               queryUserInfo
     *
     * @return
     * @description 查询个人信息
     * Modify History:              Date             Programmer       Notes
     * ---------        ---------------  ---------
     * 2017年6月7日 下午6:23:18           SharpClaw_x      Initial
     * *********************************************************************
     */
    public Map<String, Object> queryUserInfo(String userId, UserInfo loginUser) {

        String loginUserId = loginUser.getId();

        boolean isAdmin = loginUser.isAdmin();

        LoginUserinfo userObj = baseUserMapper.queryUserInfo(userId);
        Map<String, Object> user = JSONObject.parseObject(JSONObject.toJSONString(userObj));

        List<Map<String, Object>> orgInfo = baseUserMapper.queryUserOrg(userId);
        List<Map<String, Object>> teamInfo = baseUserMapper.queryUserTeam(userId);
        List<Map<String, Object>> tagInfo = baseUserMapper.queryUserTag(userId);
        List<Map<String, Object>> roleInfo = baseUserMapper.queryUserRole(userId);

        if (isAdmin) {
            //如果是超级管理员的时候显示所有的信息
            user.put("orgList", orgInfo);
            user.put("teamList", teamInfo);
            user.put("tagList", tagInfo);
            user.put("roleList", roleInfo);
            user.put("notShowOrgs", null);
            user.put("notShowTeams", null);
            user.put("notShowTags", null);
            user.put("notShowRoles", null);
        } else {
            //非超管的时候做处理，只显示该显示的，另一部分放入notShow里面

            String myOrgCodes = queryMyAllOrg(loginUserId);
            Set<String> orgList = StringUtil.strToList(myOrgCodes, ",");

            String orgCode = null;
            List<Map<String, Object>> notShowOrgs = new ArrayList<Map<String, Object>>();
            for (int i = orgInfo.size() - 1; i >= 0; i--) {
                Map<String, Object> org = orgInfo.get(i);
                if (org != null) {
                    orgCode = String.valueOf(org.get("orgCode"));
                    if (!myOrgCodes.contains(orgCode)) {
                        orgInfo.remove(i);
                        notShowOrgs.add(org);
                    }
                }
            }
            user.put("notShowOrgs", notShowOrgs);
            user.put("orgList", orgInfo);

            List<Map<String, Object>> showTeams = baseUserMapper.queryShowTeam(userId, orgList);
            user.put("teamList", showTeams);
            teamInfo.removeAll(showTeams);
            user.put("notShowTeams", teamInfo);

            List<Map<String, Object>> showTags = baseUserMapper.queryShowTags(userId, orgList);
            user.put("roleList", showTags);
            tagInfo.removeAll(showTags);
            user.put("notShowTags", tagInfo);

            List<Map<String, Object>> showRoles = baseUserMapper.queryShowRole(userId, orgList);
            user.put("tagList", showRoles);
            roleInfo.removeAll(showRoles);
            user.put("notShowRoles", roleInfo);
        }

        return user;
    }

    public List<Map<String, Object>> queryAllOrgCode() {
        return tBaseOrgMapper.queryAllOrgCode();
    }

    /**
     * Function Name               checkOrgCode
     *
     * @param orgcode
     * @return
     * @throws VanySoftBaseException
     * @description 检查orgCode是否存在
     * Modify History:              Date             Programmer       Notes
     * ---------        ---------------  ---------
     * 2017年5月19日 下午4:22:35           SharpClaw_x      Initial
     * *********************************************************************
     */
    public boolean checkOrgCode(String orgcode) throws VanySoftBaseException {
        int i = tBaseOrgMapper.checkCodeExist(orgcode);

        if (i > 0) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * Function Name               queryOrgSort
     *
     * @param parentOrgCode
     * @return
     * @throws VanySoftBaseException
     * @description 查询当前Org的排序代码
     * Modify History:              Date             Programmer       Notes
     * ---------        ---------------  ---------
     * 2017年5月23日 下午4:58:07           SharpClaw_x      Initial
     * *********************************************************************
     */
    private String queryOrgSort(String parentOrgCode) {
        int count = 0;
        char ch = 'A';
        //字母+数字方式来排序
        //字母作为分层
        if (StringUtils.isBlank(parentOrgCode)) {
            count = tBaseOrgMapper.queryRootOrgCount();
        } else {
            TBaseOrg parentOrg = tBaseOrgMapper.selectByPrimaryKey(parentOrgCode);
            ch = parentOrg.getOrgOrderNumber().charAt(0);
            ch++;

            count = tBaseOrgMapper.queryNormalOrgCount(parentOrgCode);
        }
        //当前已有的数量+1
        return String.valueOf(ch) + (++count);
    }

    /**
     * Function Name               checkOrgPerson
     *
     * @param orgCode
     * @return
     * @throws VanySoftBaseException
     * @description 检查机构下是狗还有人员
     * Modify History:              Date             Programmer       Notes
     * ---------        ---------------  ---------
     * 2017年5月23日 下午5:50:02           SharpClaw_x      Initial
     * *********************************************************************
     */
    private boolean checkOrgPerson(String orgCode) {

        int i = tBaseOrgMapper.queryOrgPerson(orgCode);

        if (i > 0) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * Function Name               checkOrgChild
     *
     * @param orgCode
     * @return
     * @throws VanySoftBaseException
     * @description 检查机构是否含有子机构
     * Modify History:              Date             Programmer       Notes
     * ---------        ---------------  ---------
     * 2017年5月23日 下午5:50:34           SharpClaw_x      Initial
     * *********************************************************************
     */
    private boolean checkOrgChild(String orgCode) {
        return tBaseOrgMapper.queryChildOrgCount(orgCode) > 0;
    }

    /**
     * Function Name               checkOrgName
     *
     * @param orgName
     * @return
     * @description 查询机构名称是否存在
     * Modify History:              Date             Programmer       Notes
     * ---------        ---------------  ---------
     * 2017年6月19日 下午6:10:11           SharpClaw_x      Initial
     * *********************************************************************
     */
    public boolean checkOrgName(String orgName, String parentCode) {
        return tBaseOrgMapper.queryOrgName(parentCode, orgName.trim()) > 0;
    }

    /**
     * Function Name               queryLoadOrgList
     *
     * @param loginUserCode
     * @return
     * @description 组织-功能授权,组织机构树加载
     * Modify History:              Date             Programmer       Notes
     * ---------        ---------------  ---------
     * 2017年6月5日 下午10:01:08          SharpClaw_x                     Initial
     * *********************************************************************
     */
    public List<Map<String, Object>> loadOrgInfo(String loginUserCode) {
//		//当前登录用户所拥有数据权限
//		String loginUserManagementScope=tBaseUserFunctionsMapper.loadDataScopeByUserCodeUnion(loginUserCode);
//		//去重
//		loginUserManagementScope=CommonUtil.removeRepeatStr(loginUserManagementScope);
//		//递归查询组织机构数据集合
//		List<Map> orgList=tBaseUserFunctionsMapper.queryDataByCodesPart(loginUserManagementScope);
//		//组织机构树
//		List<Map<String,Object>> orgTreeList=CommonUtil.getTreeDataList(orgList, "orgCode", "parentOrgCode");
//		return orgTreeList; 

        return new ArrayList<Map<String, Object>>();
    }


    /**
     * Function Name               loadFunctionByOrgCode
     *
     * @param loginUserCode
     * @param orgCode
     * @return
     * @description 根据当前登录用户代码, 所选机构编号查询待分配, 已分配功能权限
     * Modify History:              Date             Programmer       Notes
     * ---------        ---------------  ---------
     * 2017年6月6日 下午6:44:10          SharpClaw_x                     Initial
     * *********************************************************************
     */
    @SuppressWarnings({"unchecked", "rawtypes"})
    public Map<String, Object> loadFunctionByOrgCode(String loginUserCode, String orgCode) {


        Map resultMap = new HashMap<>();
//		//1.当前登录用户拥有菜单功能权限字符串-(非递归去重)
//		String loginUserFunctions=tBaseUserFunctionsMapper.loadFunctionByUserCodeUnion(loginUserCode);
//		//2.所选组织机构已分配菜单功能权限(非递归)
//		String allotFunction=tBaseOrgFunctionsMapper.queryOrgFunctionByOrgCode(orgCode);
//		//3.未分配菜单功能权限=登录用户已拥有菜单功能权限-组织机构已分配功能权限-(非递归)
//		String noAllotFunction=baseUserService.noAllotStr(loginUserFunctions, allotFunction);
//		
//		//已分配功能集合代码-(递归,重复)
//		List<Map> allotFunctionList = tBaseUserFunctionsMapper.loadFunctionByCodes(allotFunction);
//		//已分配功能字符串-(去重)
//		String allotFunctionStrs=CommonUtil.removeRepeatCode(allotFunctionList, "functionCodes");
//		//已分配功能树状结构集合
//		List<Map> allotTreeList=baseFunctionMapper.queryFunctionInfoByCodesPart(allotFunctionStrs);
//
//		//未分配功能集合代码-(递归,重复)
//		List<Map> noAllotFunctionList = tBaseUserFunctionsMapper.loadFunctionByCodes(noAllotFunction);
//		//未分配功能字符串-(去重)
//		String noAllotFunctionStrs=CommonUtil.removeRepeatCode(noAllotFunctionList, "functionCodes");
//		//未分配功能树状结构集合
//		List<Map> noAllotTreeList=baseFunctionMapper.queryFunctionInfoByCodesPart(noAllotFunctionStrs);
//		
//		
//		//根据功能字符串处理成树状结构图
//		
//		//已分配功能
//		List<Map<String,Object>> allotFunctionMapList=CommonUtil.getTreeDataList(allotTreeList, "functionCode", "parentFunctionCode");
//		//未分配功能
//		List<Map<String,Object>> noAllotFunctionMapList=CommonUtil.getTreeDataList(noAllotTreeList, "functionCode", "parentFunctionCode");
//
//		resultMap.put("noAllotFunction", noAllotFunctionMapList);
//		resultMap.put("allotFunction", allotFunctionMapList);

        return resultMap;
    }

    /**
     * Function Name               modifyOrgFunctionAllotAndRemove
     *
     * @param orgCode
     * @return
     * @description 组织机构功能权限分配与移除
     * Modify History:              Date             Programmer       Notes
     * ---------        ---------------  ---------
     * 2017年6月6日 下午8:24:50          SharpClaw_x                     Initial
     * *********************************************************************
     */
    @Transactional(propagation = Propagation.REQUIRED)
    public void modifyOrgFunctionAllotAndRemove(String orgCode, String functionCodes) {
//		if(StringUtils.isEmpty(functionCodes)){
//			functionCodes="";
//		}
//		Map map = new HashMap();
//		//移除所有权限
//		tBaseOrgFunctionsMapper.deleteAllOrgFunctionByOrgCode(orgCode);
//		
//		//重新添加
//		String[] functionCodeGroup=functionCodes.split(",");
//		for(int i=0;i<functionCodeGroup.length;i++){
//			TBaseOrgFunctions tBaseOrgFunctions=new TBaseOrgFunctions();
//			tBaseOrgFunctions.setOrgAuthorityId(UUID.randomUUID().toString());
//			tBaseOrgFunctions.setFunctionCode(functionCodeGroup[i]);
//			tBaseOrgFunctions.setOrgCode(orgCode);
//			tBaseOrgFunctionsMapper.insert(tBaseOrgFunctions);
//		}
    }

    /**
     * Function Name               orgCodeName
     *
     * @param sourceList
     * @param parent
     * @return
     * @description Modify History:              Date             Programmer       Notes
     * ---------        ---------------  ---------
     * 2017年6月20日 下午5:38:04           SharpClaw_x      Initial
     * *********************************************************************
     */
    @SuppressWarnings({"unchecked", "rawtypes"})
    public void orgCodeName(List<Map> sourceList, String parent, Map<String, String> resultMap1) {
        for (Map item : sourceList) {
            resultMap1.put(parent + item.get("orgName"), String.valueOf(item.get("orgCode")));
            if (item.containsKey("children")) {
                parent += item.get("orgName") + "/";
                orgCodeName((List<Map>) item.get("children"), parent, resultMap1);
                parent = parent.replace(String.valueOf(item.get("orgName")) + "/", "");
            } else {
            }
        }
    }

}
